// 版权所有2009年围棋作者。版权所有。
// 此源代码的使用受BSD样式的约束
// 可以在许可证文件中找到的许可证。

package base

import (
	"os"
)

var atExitFuncs []func()

func AtExit(f func()) {
	atExitFuncs = append(atExitFuncs, f)
}

func Exit(code int) {
	for i := len(atExitFuncs) - 1; i >= 0; i-- {
		f := atExitFuncs[i]
		atExitFuncs = atExitFuncs[:i]
		f()
	}
	os.Exit(code)
}

// 要启用跟踪支持（-t标志），请将EnableTrace设置为true。
const EnableTrace = false

func Compiling(pkgs []string) bool {
	if Ctxt.Pkgpath != "" {
		for _, p := range pkgs {
			if Ctxt.Pkgpath == p {
				return true
			}
		}
	}

	return false
}

// 赛马通行证目前分为三个部分。
// None
// 首先，对于flag_race，它插入对racefuncenter和
// 在每个的起点和终点（分别）退出
// 作用这在下面处理。
// None
// 第二，在构建SSA期间，它插入适当的工具
// 在每次内存加载或存储之前立即调用。这件事已经处理好了
// 通过ssa.go中的（*state）.instrument方法，我们在这里设置
// 根据需要设置Func.InstrumentBody标志。了解为什么会这样的背景
// 在SSA施工期间完成，而不是单独的SSA通行证，
// 见第19054期。
// None
// 第三，我们删除了对叶的racefuncenter和racefuncexit的调用
// 没有指令化操作的函数。这是作为项目的一部分完成的
// ssa通过特殊规则选择通行证。

// TODO（dvyukov）：不要以写入方式插入初始化：
// a:=make（[]整数，10）

// 完全不要对以下软件包进行测试，
// 充其量，插装将导致无限递归。
var NoInstrumentPkgs = []string{
	"runtime/internal/atomic",
	"runtime/internal/sys",
	"runtime/internal/math",
	"runtime",
	"runtime/race",
	"runtime/msan",
	"internal/cpu",
}

// 不要将racefuncenter/racefuncexit插入以下程序包。
// 包中的内存访问要么无趣，要么会导致误报。
var NoRacePkgs = []string{"sync", "sync/atomic"}
